package com.tedu.api.ee;

import org.testng.annotations.Test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 流--传输数据---传输数据过程绝对不能出错【处理手段】
 * 标准流结合异常---标准IO
 *
 * 异常
 * JAVA面向对象语言，程序中所有出现的错误，定义为对象【处理对应错误】
 *
 * Throwable 顶级异常超类
 *
 * Exception异常，描述程序级别的错误---有解决方案
 *              编译期：--RunTimeException异常表示类--
 *                     FileOutputStream创建对象--波浪线--抛出方法之外
 *             检查异常：通常都是编译器检查处理，程序直接报错，抛出
 *             解决方案：①捕获异常（*）
 *                     ②抛出异常  ---抛出方法之外---打印控制台
 *
 *              运行期：控制台直接显示异常对象【异常对象名字，产生原因】
 *                非检查异常：控制台直接输出异常对象名称RunTimeException异常表示类
 *
 *              最后了解 【throw与throws---RunTimeException】
 *
 * Error错误：描述系统级别的错误--出现---程序宕机
 *           非常低--->递归问题--->
 *
 *
 */
public class EE {
    /**
     * Error  错误---无解 程序严重错误
     * 模拟：方法掉方法---栈溢出错误
     *
     * ------程序宕机-----
     * while(true){
     *     拼接字符串对象
     * }
     */
  /*  public static void method(){
            method();
    }
    @Test
    public void testError(){
        EE.method();
    } */

    /**
     * Exception异常：检查异常【出现编译器】---代码报波浪线
     *                两种处理手段：①捕获异常
     *                         语法：try{
     *                              怀疑代码可能有异常或者提示异常
     *                                 }catch(小异常名字 e){
     *                              e.printStacktrace; 打印异常信息
     *                                 }catch(中异常 e){
     *                              e.printStacktrace; 打印异常信息
     *                               }catch(大异常 e){
     *                              e.printStacktrace; 打印异常信息
     *                               }finally{
     *                                   一定执行代码块
     *                               }
     *
     *
     *                            ②抛出异常  throws 异常的名字【并未解决】
     *                  考试题：throw与throws的区别
     *                  异常关键字：throw
     *                            throws
     *
     *               非检查异常【出现运行期】---代码无错误--控制台
     *-------------------------
     * 异常： FileNotFoundException    文件不存在异常
     *
     *
     *
     * 产生原因：路径写错，文件名写错
     * 异常：NullPointerException   空指针异常
     * 产生原因：获取字符串为空，数组：值为空，集合：元素为空【存在null值】
     * 异常：StringIndexOutOfBoundsException 字符串下标越界异常
     * 产生原因：字符串下标没有对应字符
     *异常：NumberFormatException  数字转换异常
     * 产生原因；字符串不是正确的类型
     */
    @Test
    public void testException() throws FileNotFoundException {
        //检查异常【出现编译器】--代码报波浪线
        // FileOutputStream fis=new FileOutputStream("");
        //非检查异常【出现运行期】--控制台
        try {
            String str="a";

            str.length();
            str.charAt(1);

            Integer.parseInt(str);  //解析字符串--转换为对应类型
        }
        catch(StringIndexOutOfBoundsException e){
            e.printStackTrace();//打印异常对象信息
            System.out.println("字符串小异常，下标越界异常~~");
        } catch (NumberFormatException e) {

            e.printStackTrace(); //打印异常信息
            System.out.println("字符串小异常~~~");
        } catch(Exception e){
            e.printStackTrace();

               System.out.println("大异常~~");
        } finally {
            System.out.println("一定执行代码块");
        }
    }

    /**
     * 作业1：写出五个【非检查】异常的代码示例
     * 提示：查API---java.lang.异常
     *     字符串，包装类，集合，IO流
     */
    @Test
    public void testHomeWork1(){
        //1.IllegalArgumentException异常

        DateTimeFormatter dtf= DateTimeFormatter.ofPattern("null");
        //2.DateTimeException异常

        LocalDateTime c=LocalDateTime.of(2024,24,30,17,42);
        // 3.IOException异常

        FileInputStream fis=null;
        try {
            fis.read();
            fis=new FileInputStream("fos.txt");
        }
        catch(IOException e){
            e.printStackTrace();
        }

        //4.NoSuchElementException异常

        List<String> list=new ArrayList<>();
        Iterator<String> it=list.iterator();

        String next=it.next();

        //5.ClassCastException异常
        Object o=new Object();
        String s= (String)o;


    }

}
